package com.atguigu.gmall.starter.redisson;


import com.atguigu.gmall.starter.constant.RedisConst;
import org.redisson.Redisson;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * Redisson的自动配置类
 */
@AutoConfigureAfter(RedisAutoConfiguration.class) //在redis自动配置后再进行
@Configuration
public class AppRedissonAutoConfiguration {
    /**
     * 注入所有的布隆任务,创建布隆过滤器的时候就会自动运行这些任务
     *
     * @Autowired(required=true)：当使用@Autowired注解的时候，其实默认就是@Autowired(required=true)，
     * 表示注入的时候，该bean必须存在，否则就会注入失败。
     */
    @Autowired(required = false) //表示忽略当前要注入的bean，如果有直接注入，没有跳过，不会报错。
    List<BloomTask> bloomTask;
    /**
     *
     * @param redisProperties 自动注入redis配置
     * @return
     */
    @Bean
    public RedissonClient redissonClient(RedisProperties redisProperties){
        Config config = new Config();
        config.useSingleServer().
                setAddress("redis://"+redisProperties.getHost()+":"+redisProperties.getPort()).
                setPassword(redisProperties.getPassword());
        RedissonClient redissonClient = Redisson.create(config);
        return redissonClient;
    }

    /**
     * 注入常用的布隆过滤器
     * @param redissonClient
     * @return
     */
    @Bean
    public RBloomFilter<Object> skuIdBloom(RedissonClient redissonClient){
        RBloomFilter<Object> filter = redissonClient.getBloomFilter(RedisConst.BLOOM_SKU_ID);
        if (filter.isExists()) {
            //如果存在,代表有这个
            return filter;
        }else {
            //如果不存在,要初始化这个
            filter.tryInit(50000000, 0.00000001);
            //准备数据
            for (BloomTask task : bloomTask) {
                if ( task instanceof SkuBloomTask){
                    //只运行自己的初始化任务
                    task.initData(filter);
                }
            }
        }
        return filter;
    }
}
